package tadp.tp.domain;

import java.util.List;
import accionesPosteriores.AccionDeUsuario;
import cantidadReuniones.*;
import tadp.tp.domain.condiciones.Condicion;

public class Persona implements Reservable {
	
	private Agenda agenda;
	private Edificio edificio;
	private String nombre;
	private Proyecto proyecto;
	private String sector;
	private String rol;
	private String horarioIngreso;
	private String horarioSalida;
	private Double valorHora;
	private Double costoTransporte;
	private CargaReuniones estadoDeReuniones;
	private AccionDeUsuario accionDeUsuario;
	private HomePersonas homePersonas=HomePersonas.getInstance();

	public Persona(String nombre, Edificio edificio, Proyecto proyecto,	String sector, String unRol,
				String unHorarioIng, String unHorarioSal, Double unValor, Double uncostoTransporte, AccionDeUsuario accionDeUsuario) {
		this.setEdificio(edificio);
		this.setNombre(nombre);
		this.setProyecto(proyecto);
		this.setSector(sector);
		this.setRol(unRol);
		this.setCostoTransporte(uncostoTransporte); 
		this.setHorarioIngreso(unHorarioIng);
		this.setHorarioSalida(unHorarioSal);
		this.setValorHora(unValor);
		this.setAccionDeUsuario(accionDeUsuario);
		this.homePersonas.agregarPersona(this);
		this.agenda = new Agenda(this);
		this.estadoDeReuniones = CargaPoca.getInstance(); 
		this.getProyecto().getPersonas().add(this);
	}
	
	public Boolean cumpleCondiciones(List<Condicion> unasCondiciones) {
		for (Condicion unaCondicion : unasCondiciones) {
			if (!unaCondicion.seCumplePor(this)) {
				return false;
			}
		}
		return true;
	}
	
	public Boolean perteneceAlHorarioLaboral(String horarioInicial, String horarioFinal){
		return (Double.parseDouble(this.horarioIngreso) <= Double.parseDouble(horarioInicial)
				&& Double.parseDouble(horarioSalida) >= Double.parseDouble(horarioFinal));
	}
	
	public void darDeBajaDe(Reunion unaReunion){
		unaReunion.avisar(this);		
		this.agenda.getReuniones().remove(unaReunion.getHorario());
	}
		
	public Double horasDeReunionesDentroDelRango(Fecha fechaReunion, int limite){		
		return agenda.horasDeReunionesDentroDelRango(fechaReunion, limite);	
	}
	
	public boolean SosObligatorioPara(Reunion reunion) {
		return reunion.getRecursosObligatorios().contains(this);
	}
	
//***************Getters y Setters****************************************************
	public Edificio getEdificio() {
		return edificio;
	}

	public void setEdificio(Edificio edificio) {
		this.edificio = edificio;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public Proyecto getProyecto() {
		return proyecto;
	}

	public void setProyecto(Proyecto unProyecto) {
		this.proyecto = unProyecto;
	}
	
	public String getSector() {
		return sector;
	}
	
	public void setSector(String sector) {
		this.sector = sector;
	}
	
	public String getRol() {
		return this.rol;
	}

	public void setRol(String unRol) {
		this.rol = unRol;
		// TODO Auto-generated method stub
	}
	
	private void setHorarioIngreso(String unHorarioIng) {
		this.horarioIngreso = unHorarioIng;
		// TODO Auto-generated method stub
	}

	private void setHorarioSalida(String unHorarioSal) {
		this.horarioSalida = unHorarioSal;
		// TODO Auto-generated method stub
	}

	public Double getValorHora() {
		return valorHora;
	}

	public void setValorHora(Double valorHora) {
		this.valorHora = valorHora;
	}

	public Double getCostoTransporte() {
		return costoTransporte;
	}

	public void setCostoTransporte(Double costoTransporte) {
		this.costoTransporte = costoTransporte;
	}

	public CargaReuniones getEstadoDeReuniones() { 
		return this.estadoDeReuniones;
	}

	public void setEstadoDeReuniones(CargaReuniones estadoDeReuniones) {
		this.estadoDeReuniones = estadoDeReuniones;
		
	}
	
	public AccionDeUsuario getAccionDeUsuario() {
		return accionDeUsuario;
	}

	public void setAccionDeUsuario(AccionDeUsuario accionDeUsuario) {
		this.accionDeUsuario = accionDeUsuario;
	}
	
	public String getHorarioIngreso() {
		return horarioIngreso;
	}

	public String getHorarioSalida() {
		return horarioSalida;
	}

	public Agenda getAgenda(){
		return this.agenda;
	}
	
}
